package com.example.demo.tools;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;


//使用前我们要在主运行函数加上
// 在注解@SpringBootApplication
// 添加exclude =
//{org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class})
// 是进行BCrypt加密


//encode方法：对用户密码进行加密
//matches方法：参数一，待检验的未加密的密码 。参数二：从数据库中查询出的加密后密码
public class BCryptTest {
    public static void main(String[] args) {
        // 模拟从前端获取的密码
        String password = "1234";
        // 新建一个BCryptPasswordEncoder
        BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
        // 对密码进行加密
        String newPassword = bCryptPasswordEncoder.encode(password);
        // 输出加密之后的结果
        System.out.println("加密的密码为：" + newPassword);
//        加密的密码为：$2a$10$a0lZfMpBy8nCuw5XPUhnWONxPxDSnjsHa.1i1OPId18sp9CrsmywG
//        加密的密码为：$2a$10$zPX3DZeT4vjhw0L8QwqDWON2UOfTukYaSAKVjMZbfRJqQZYy9wVgW
//        每次运行就结果都不一样


//        他是怎么验证密码是正确的呢？我们每次生成的密码又不一样
        //使用matches方法进行密码的效验
        boolean same_password_result = bCryptPasswordEncoder.matches(password, newPassword);
        //返回true
        System.out.println("加密的密码和正确的密码对比结果： " + same_password_result);


        boolean other_password_result = bCryptPasswordEncoder.matches("345345", newPassword);
        //返回false
        System.out.println("加密的密码和错误的密码对比： " + other_password_result);
//

//
//通过BCryptPasswordEncoder提供matches 方法来比较原密码和加密之后的密码，match里面有着自己的比较方式。
//我们需要知道的是:无论密码被加密成什么样子，通过matches方法，都能给匹配到原密码。
//所以，我们可以通过matches 来比较新密码和旧密码是否是同一个密码。
//如果是同一个密码，返回true, 否则，返回false
//因为newPassword是根据123456 加密生成的密码，所以第一个matches 的结果为true; 第二个为false.




//1、 密码学的应用安全，是建立在破解所要付出的成本远超出能得到的利益上的 。
//2、 使用BCrypt相比于MD5加密更好的一点在于，破解的难度上加大
//3、 BCrypt的破解成本增加了，导致系统的运行成本也会大大的增加 。
//4、 回到本质的问题，你的数据库中的数据价值如何？如果你是银行类型的，那么使用BCrypt是不错的，一般情况使用MD5加盐，已经够用了。



//两种加密方式的区别
//BCrypt加密：
//一种加盐的单向Hash，不可逆的加密算法，同一种明文（plaintext），每次加密后的密文都不一样，而且不可反向破解生成明文，破解难度很大。
//MD5加密：
//是不加盐的单向Hash，不可逆的加密算法，同一个密码经过hash的时候生成的是同一个hash值，在大多数的情况下，有些经过md5加密的方法将会被破解。
//注意！我们刚才在模拟实现 MD5 的时候，是加了盐的！
//只不过是固定盐。
//当然，也可以是随机盐，只不过要我们自己去实现宇哥随机盐。
//也就是说 MD5 是可以 加 盐 混合使用的。
//Bcrypt生成的密文是60位的。而MD5的是32位的。
//目前，MD5和BCrypt比较流行。
//相对来说，BCrypt比MD5更安全，但加密更慢。
//虽然BCrpyt也是输入的字符串+盐，但是与MD5+盐的主要区别是：
//每次加的盐不同，导致每次生成的结果也不相同。无法比对！
    }
}
